﻿// 文件路径: Views/NavRoomView.xaml.cs
using RevitProject.SpaceManager.ViewModel.NavRoomVmPart; // 引用 ViewModel 命名空间
using System.Diagnostics;
using System;
using System.Windows; // 引用 RoutedEventArgs
using System.Windows.Controls;
using System.Collections.Generic; // 引用 UserControl, CheckBox
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using CommunityToolkit.Mvvm.Input;

using System.Collections; // Required for IList
using System.Collections.ObjectModel;
using System.Linq;

using System.Windows.Input; // 需要 MouseEventArgs, DragEventArgs
using System.Windows.Media;
using Point = System.Windows.Point; // 需要 VisualTreeHelper

using System.Windows.Controls.Primitives;
using RevitProject.SpaceManager.ViewModel.SpaceViewModel;
using RevitProject.SpaceManager.ViewModel.RoomViewModelPart;
using RevitProject.SpaceManager.ViewModel;
using RevitProject.SpaceManager.ViewModel.HAVCLoadViewModelPart;
using System.ComponentModel; // Selector
namespace RevitProject.SpaceManager.Views
{


    /// <summary>
    /// 新房间视图 NavRoomView.xaml 的交互逻辑。
    /// </summary>
    public partial class NavRoomView : UserControl
    {



        private bool _isDataLoaded = false; 
        /// <summary>
        /// 初始化 NavRoomView。
        /// </summary>
        public NavRoomView()
        {
            InitializeComponent();
            // DataContext 将由使用此 UserControl 的地方（如 SpaceManagerView 的 DataTemplate）设置。
        }

        /// <summary>
        /// 用于进入房间视图时加载数据。
        /// </summary>
        private async void NavRoomView_Loaded(object sender, RoutedEventArgs e)
        {
            // 使用标志位确保只在首次加载时执行
            if (!_isDataLoaded)
            {
                Debug.WriteLine("NavRoomView 已加载，尝试执行初始数据加载...");
                // 尝试获取 DataContext (即 NavRoomViewModel)
                if (this.DataContext is NavRoomViewModel viewModel)
                {
                    // 检查加载命令是否可以执行
                    if (viewModel.LoadDataCommand != null && viewModel.LoadDataCommand.CanExecute(null))
                    {
                        try
                        {
                            // 异步执行加载命令
                            await viewModel.LoadDataCommand.ExecuteAsync(null);
                            _isDataLoaded = true; // 标记数据已加载
                            Debug.WriteLine("NavRoomView: 初始数据加载命令已成功执行。");
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine($"NavRoomView: 调用 LoadDataCommand 时发生错误: {ex.ToString()}");
                            // 可以选择性地显示错误给用户
                            // MessageBox.Show($"加载房间数据时出错: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                        }
                    }
                    else
                    {
                        Debug.WriteLine("NavRoomView: LoadDataCommand 为 null 或当前不可执行。");
                    }
                }
                else
                {
                    Debug.WriteLine("NavRoomView: DataContext 不是 NavRoomViewModel 或为 null。");
                }
            }
            else
            {
                Debug.WriteLine("NavRoomView: 数据已加载过，跳过重复加载。");
            }
        }


        /// <summary>
        /// 处理 DataGrid 表头 CheckBox 的 Checked 事件（全选）。
        /// </summary>
        /// <param name="sender">事件发送者 (CheckBox)。</param>
        /// <param name="e">路由事件参数。</param>
        private void HeaderCheckBox_Checked(object sender, RoutedEventArgs e)
        {
            // 尝试获取 ViewModel 并执行全选命令
            if (this.DataContext is NavRoomViewModel viewModel && viewModel.SelectAllRoomsCommand.CanExecute(null))
            {
                viewModel.SelectAllRoomsCommand.Execute(null);
            }
        }

        /// <summary>
        /// 处理 DataGrid 表头 CheckBox 的 Unchecked 事件（全不选）。
        /// </summary>
        /// <param name="sender">事件发送者 (CheckBox)。</param>
        /// <param name="e">路由事件参数。</param>
        private void HeaderCheckBox_Unchecked(object sender, RoutedEventArgs e)
        {
            // 尝试获取 ViewModel 并执行全不选命令
            if (this.DataContext is NavRoomViewModel viewModel && viewModel.DeselectAllRoomsCommand.CanExecute(null))
            {
                viewModel.DeselectAllRoomsCommand.Execute(null);
            }
        }



        /// <summary>
        /// 处理“列设置”按钮的点击事件。
        /// **将所有相关逻辑放在此处。**
        /// </summary>
        /// <summary>
        /// 处理“列设置”按钮的点击事件。
        /// **直接在 Code-Behind 中操作列的 Visibility。**
        /// </summary>
        private void ColumnSettingsButton_Click(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("NavRoomView: 列设置按钮被点击 (方案 A: Code-Behind 控制 Visibility)。");

            // 1. 准备传递给旧对话框的数据
            //    需要知道当前哪些列是可见的，以便初始化对话框的勾选状态。
            var currentColumnInfos = new List<RevitProject.SpaceManager.Views.ColumnVisibilityInfo>();
            //    需要一种方式将列的 Header/x:Name 映射到对话框期望的标识符
            //    假设旧对话框使用 Header 作为标识符。

            //    构建一个查找表：Header -> Column 对象 (或者 x:Name -> Column 对象)
            var columnLookup = RoomDataGrid.Columns
                                     .Where(c => c.Header != null) // 过滤掉没有 Header 的列（如复选框列）
                                     .ToDictionary(c => c.Header.ToString(), c => c, System.StringComparer.OrdinalIgnoreCase); // 使用 Header 作为 Key

            //    如果 ViewModel 仍然有 AllAvailableRoomColumns，可以用它来生成对话框列表
            if (this.DataContext is NavRoomViewModel viewModel)
            {
                foreach (var kvp in viewModel.AllAvailableRoomColumns.OrderBy(kv => kv.Value))
                {
                    // 查找对应的 DataGridColumn 以获取当前 Visibility
                    columnLookup.TryGetValue(kvp.Value, out DataGridColumn currentColumn); // kvp.Value 是 Header
                    currentColumnInfos.Add(new RevitProject.SpaceManager.Views.ColumnVisibilityInfo
                    {
                        Header = kvp.Value,
                        ColumnName = kvp.Value, // 假设旧类需要
                        IsVisible = currentColumn?.Visibility == System.Windows.Visibility.Visible // 从实际列获取状态
                    });
                }
            }
            else
            {
                // 如果无法访问 ViewModel，则基于 DataGrid 现有列构建
                foreach (var column in RoomDataGrid.Columns.OfType<DataGridColumn>()) // 使用 OfType 过滤
                {
                    if (column.Header != null)
                    {
                        currentColumnInfos.Add(new Views.ColumnVisibilityInfo
                        {
                            Header = column.Header.ToString(),
                            ColumnName = column.Header.ToString(),
                            IsVisible = column.Visibility == System.Windows.Visibility.Visible
                        });
                    }
                }
                // 可能需要排序
                currentColumnInfos = currentColumnInfos.OrderBy(ci => ci.Header).ToList();
            }


            Debug.WriteLine($"准备显示列设置对话框，当前状态包含 {currentColumnInfos.Count} 列。");

            // 2. 显示旧对话框
            ColumnSelectionDialog dialog = null;
            bool? dialogResult = null;
            try
            {
                dialog = new ColumnSelectionDialog(currentColumnInfos) { Owner = GetActiveWindow(this) };
                dialogResult = dialog.ShowDialog();
                Debug.WriteLine($"对话框已关闭，DialogResult = {dialogResult}");
            }
            catch (Exception ex) { /* ... 错误处理 ... */ return; }

            // 3. 处理对话框返回结果，直接修改列的 Visibility
            if (dialogResult == true && dialog != null)
            {
                Debug.WriteLine("用户点击了确定。开始更新列的 Visibility...");
                var returnedInfos = dialog.ColumnInfos; // 旧类型 List<Views.ColumnVisibilityInfo>

                // 遍历 DataGrid 的所有列
                foreach (var column in RoomDataGrid.Columns.OfType<DataGridColumn>()) // 使用 OfType
                {
                    if (column.Header == null) continue; // 跳过没有 Header 的列

                    string header = column.Header.ToString();

                    // 在返回结果中查找与当前列 Header 匹配的项
                    var visibilityInfo = returnedInfos.FirstOrDefault(info => info.Header.Equals(header, System.StringComparison.OrdinalIgnoreCase));

                    if (visibilityInfo != null)
                    {
                        // 根据对话框中的 IsVisible 设置列的 Visibility
                        column.Visibility = visibilityInfo.IsVisible ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
                        Debug.WriteLine($"列 '{header}' Visibility 设置为: {column.Visibility}");
                    }
                    else
                    {
                        // 如果对话框返回结果中没有这一列（理论上不应发生），可以选择隐藏或保持不变
                        // column.Visibility = Visibility.Collapsed;
                        Debug.WriteLine($"警告：对话框返回结果中未找到列 '{header}' 的信息。");
                    }
                }
                Debug.WriteLine("列 Visibility 更新完成。");
            }
            else
            {
                Debug.WriteLine("用户取消了对话框或对话框实例为 null。");
            }
        }

        /// <summary>
        /// 获取当前控件所在的窗口。
        /// </summary>
        private Window GetActiveWindow(FrameworkElement element)
        {
            return Window.GetWindow(element) ?? Application.Current?.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);
        }
        
        


    }
}